#ifndef MPU6050_ESWIN_H
#define MPU6050_ESWIN_H

#include "i2c_driver.h"
#include "status.h"
#include <stdint.h>
#include "math.h"
// MPU6050 I2C 地址
#define MPU6050_ADDR 0x68 // AD0 引脚接地时的地址

// 寄存器地址
#define MPU6050_REG_SMPLRT_DIV   0x19
#define MPU6050_REG_CONFIG       0x1A
#define MPU6050_REG_GYRO_CONFIG  0x1B
#define MPU6050_REG_ACCEL_CONFIG 0x1C
#define MPU6050_REG_INT_PIN_CFG  0x37
#define MPU6050_REG_INT_ENABLE   0x38
#define MPU6050_REG_ACCEL_XOUT_H 0x3B
#define MPU6050_REG_TEMP_OUT_H   0x41
#define MPU6050_REG_GYRO_XOUT_H  0x43
#define MPU6050_REG_PWR_MGMT_1   0x6B
#define MPU6050_REG_WHO_AM_I     0x75

// 加速度计量程
typedef enum {
    ACCEL_RANGE_2G  = 0, // ±2g
    ACCEL_RANGE_4G  = 1, // ±4g
    ACCEL_RANGE_8G  = 2, // ±8g
    ACCEL_RANGE_16G = 3  // ±16g
} mpu6050_accel_range_t;

// 陀螺仪量程
typedef enum {
    GYRO_RANGE_250DPS  = 0,  // ±250°/s
    GYRO_RANGE_500DPS  = 1,  // ±500°/s
    GYRO_RANGE_1000DPS = 2,  // ±1000°/s
    GYRO_RANGE_2000DPS = 3   // ±2000°/s
} mpu6050_gyro_range_t;

// 数字低通滤波器设置
typedef enum {
    DLPF_BW_260HZ = 0, // 加速度计260Hz，陀螺仪256Hz
    DLPF_BW_184HZ = 1, // 加速度184Hz，陀螺188Hz
    DLPF_BW_94HZ  = 2, // 加速度94Hz，陀螺98Hz
    DLPF_BW_44HZ  = 3, // 加速度44Hz，陀螺42Hz
    DLPF_BW_21HZ  = 4, // 加速度21Hz，陀螺20Hz
    DLPF_BW_10HZ  = 5, // 加速度10Hz，陀螺10Hz
    DLPF_BW_5HZ   = 6  // 加速度5Hz，陀螺5Hz
} mpu6050_dlpf_t;

// 传感器数据结构
typedef struct {
    int16_t accel_x;
    int16_t accel_y;
    int16_t accel_z;
    int16_t temp;
    int16_t gyro_x;
    int16_t gyro_y;
    int16_t gyro_z;
} mpu6050_raw_data_t;

// 校准数据结构
typedef struct {
    int16_t accel_x_offset;
    int16_t accel_y_offset;
    int16_t accel_z_offset;
    int16_t gyro_x_offset;
    int16_t gyro_y_offset;
    int16_t gyro_z_offset;
} mpu6050_calib_data_t;

// MPU6050 句柄
typedef struct {
    uint8_t i2cInstance;           // I2C 实例
    i2c_master_state_t *i2cState;  // I2C 状态指针
    mpu6050_accel_range_t accel_range;
    mpu6050_gyro_range_t gyro_range;
    float accel_scale;             // 加速度计比例因子
    float gyro_scale;              // 陀螺仪比例因子
    mpu6050_calib_data_t calib;    // 校准数据
} mpu6050_handle_t;

/**
 * @brief 初始化 MPU6050 传感器
 * 
 * @param handle MPU6050 句柄
 * @param i2cInstance I2C 实例
 * @param i2cState I2C 状态指针
 * @return status_t 初始化状态
 */
status_t MPU6050_Init(mpu6050_handle_t *handle, uint8_t i2cInstance, i2c_master_state_t *i2cState);

/**
 * @brief 配置 MPU6050 传感器
 * 
 * @param handle MPU6050 句柄
 * @param accel_range 加速度计量程
 * @param gyro_range 陀螺仪量程
 * @param dlpf 数字低通滤波器设置
 * @return status_t 配置状态
 */
status_t MPU6050_Config(mpu6050_handle_t *handle, 
                        mpu6050_accel_range_t accel_range, 
                        mpu6050_gyro_range_t gyro_range, 
                        mpu6050_dlpf_t dlpf);

/**
 * @brief 读取原始传感器数据
 * 
 * @param handle MPU6050 句柄
 * @param data 存储原始数据的结构体
 * @return status_t 读取状态
 */
status_t MPU6050_ReadRawData(mpu6050_handle_t *handle, mpu6050_raw_data_t *data);

/**
 * @brief 读取加速度计数据 (单位: g)
 * 
 * @param handle MPU6050 句柄
 * @param accel_x X轴加速度 (g)
 * @param accel_y Y轴加速度 (g)
 * @param accel_z Z轴加速度 (g)
 * @return status_t 读取状态
 */
status_t MPU6050_ReadAccel(mpu6050_handle_t *handle, float *accel_x, float *accel_y, float *accel_z);

/**
 * @brief 读取陀螺仪数据 (单位: °/s)
 * 
 * @param handle MPU6050 句柄
 * @param gyro_x X轴角速度 (°/s)
 * @param gyro_y Y轴角速度 (°/s)
 * @param gyro_z Z轴角速度 (°/s)
 * @return status_t 读取状态
 */
status_t MPU6050_ReadGyro(mpu6050_handle_t *handle, float *gyro_x, float *gyro_y, float *gyro_z);

/**
 * @brief 读取温度数据 (单位: °C)
 * 
 * @param handle MPU6050 句柄
 * @param temperature 温度值 (°C)
 * @return status_t 读取状态
 */
status_t MPU6050_ReadTemperature(mpu6050_handle_t *handle, float *temperature);

/**
 * @brief 校准传感器
 * 
 * @param handle MPU6050 句柄
 * @param samples 校准采样次数
 * @return status_t 校准状态
 */
status_t MPU6050_Calibrate(mpu6050_handle_t *handle, uint16_t samples);

/**
 * @brief 设置睡眠模式
 * 
 * @param handle MPU6050 句柄
 * @param sleep 1: 睡眠模式, 0: 正常工作模式
 * @return status_t 设置状态
 */
status_t MPU6050_SetSleepMode(mpu6050_handle_t *handle, uint8_t sleep);

/**
 * @brief 读取设备ID
 * 
 * @param handle MPU6050 句柄
 * @param id 存储设备ID的变量
 * @return status_t 读取状态
 */
status_t MPU6050_ReadDeviceID(mpu6050_handle_t *handle, uint8_t *id);

void CalculateAngles(float ax, float ay, float az, float *pitch, float *roll);

#endif // MPU6050_ESWIN_H
